#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn=1e5+5;


// 使用邻接表记录树
int head[maxn];
int cnt; // 记录边的条数
struct Edge{
	int next; // 下一条边的值
	int to; // 边指向的节点
}edges[maxn<<1]; // 每条边要加入 2 次

// 加入边
void add(int from , int to){
	edges[++cnt].next = head[from]; // 头插法
	edges[cnt].to = to;
	head[from] = cnt;// 记录第一条边的下标
}

int dep[maxn]; // 记录每个节点的深度
int fa[maxn][30]; // fa[i][j] 表示节点 i 的第 2^j 个父亲节点 // 注意列不要开小了


void dfs(int x, int f){
	dep[x] = dep[f]+1;
	fa[x][0] = f;
	for (int i=head[x];i;i=edges[i].next) {
		int t=edges[i].to;
		if (t==f) {
			// 已经遍历过了
			continue;
		}
		dfs(t, x); // 继续深度优先遍历
	}
}

int lca(int x, int y){
	// 默认让 x 更深
	if (dep[x] < dep[y]) {
		swap(x, y);
	}
	// 让 x 跳到与 y 同高度
	for (int i=20;i>=0;i--) {
		// 从大开始跳 
		if (dep[fa[x][i]] >= dep[y]) {
			x = fa[x][i];
		}
	}
	// 已经跳到同一高度
	if (x==y) {
		// 重叠了
		return x;
	}
	// 不重叠同时往上跳
	for (int i=20;i>=0;i--) {
		if (fa[x][i]!=fa[y][i]) {
			// 跳的条件是两个节点的父亲节点不一样
			// 不然很容易找到不是最近的父亲节点
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	// 最后一定会出现一种情况就是, 两个节点都只剩一步就跳到lca
	// 使用 2 进制就可以知道
	return fa[x][0];
}

void solve(){
	int n;
	cin >> n;
	for (int i=1;i<=n-1;i++) {
		int a, b;
		cin >> a >> b;
		// 一条边加入两次,后续 DFS 可以更容易判断是否已经遍历过了
		add(a, b);
		add(b, a);
	}
	// 记录深度以及每个节点的父亲节点
	dfs(1, 0);
	// 预处理 每个节点的父亲节点
	for (int j=1;j<=20;j++) {
		for (int i=1;i<=n;i++) {
			fa[i][j]=fa[fa[i][j-1]][j-1];
		}
	}
	int q;
	cin >> q;
	// 处理 q 次询问
	for (int i=1;i<=q;i++) {
		int a, b;
		cin >> a>>b;
		cout << lca(a, b) << '\n';
	}
}



signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t;
	t=1;
	while(t--){
		//TODO
		solve();
	}
	
	return 0;
}
